home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mission 3
/
Mission 3.zip
/
Mission 3.iso
/
zugabe
/
va45
/
visual45
/
library
/
extend
/
rsc.s
< prev
next >
Wrap
Text File
|
1998-07-25
|
34KB
|
1,376 lines
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST_IDX
; Description : Indique si l'objet RSC contient une structure TEDINFO
;
; Rq : a0.l/d0.l modifié
;
; in : a0.l = pointeur sur l'arbre RSC
; in : d0.w = index de l'objet RSC
; out : d7.w = GWVA_NO_ERROR_GENERIC si un TEDINFO existe, GWVA_NO_ERROR_GENERIC sinon
;
; 24/05/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST_IDX:
mulu #L_OBJECT,d0
add.l d0,a0
bra GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST
; Description : Indique si l'objet RSC contient une structure TEDINFO
;
; Rq : -
;
; in : a0.l = pointeur sur l'objet RSC
; out : d7.w = GWVA_NO_ERROR_GENERIC si un TEDINFO existe, GWVA_NO_ERROR_GENERIC sinon
;
; 24/05/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_TEST_IF_TEDINFO_STRUCT_EXIST:
move.w #GWVA_ERROR_GENERIC,d7
cmp.w #G_TEXT,ob_type(a0)
beq.s .TEDINFO
cmp.w #G_BOXTEXT,ob_type(a0)
beq.s .TEDINFO
cmp.w #G_FTEXT,ob_type(a0)
beq.s .TEDINFO
cmp.w #G_FBOXTEXT,ob_type(a0)
bne.s .pas_TEDINFO
.TEDINFO:
move.w #GWVA_NO_ERROR_GENERIC,d7
.pas_TEDINFO:
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_GO_OVER_TREE
; Description : Parcours un (sous-)arbre et exécute un routine pour chaque objet
; Description : de cet arbre.
;
; Rq : La routine ne s'arrête qu'une fois tous les objets parcourus ou bien
; Rq : jusqu'à ce que la routine renvoit d7.w = GWVA_RSC_CTE_STOP_GO_OVER.
; Rq : La routine reçoit les paramètres suivant :
; Rq : in : a0.l = adresse de base de l'arbre (objet #0)
; Rq : in : a1.l = pointeur sur la routine à exécuter (terminée par un RTS)
; Rq : in : a2.l = pointeur sur l'objet courant
; Rq : in : d0.w = index de l'objet courant
; Rq : in : d1.w = index du père de l'objet courant (-1 pour le root)
; Rq : La routine doit renvoyer le paramètre :
; Rq : out : d7.w = GWVA_RSC_CTE_CONTINUE_GO_OVER ou GWVA_RSC_CTE_STOP_GO_OVER
;
; in : a0.l = adresse de base de l'arbre (objet #0)
; in : a1.l = pointeur sur la routine à exécuter (terminée par un RTS)
; in : a2.l = pointeur sur l'objet de départ du parcours
; in : d0.w = index de l'objet de départ
; in : d1.w = index du père de l'objet de départ (-1 pour le root)
;
; 23/05/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_GO_OVER_TREE:
link a6,#-(2+4)
move.w d1,(a7) ; stock numéro du père
.same_level:
move.l a2,2(a7) ; et l'adresse de l'objet courant
save.l a0-a2/a6/d0-d1
jsr (a1)
load.l a0-a2/a6/d0-d1
cmp.w #GWVA_RSC_CTE_STOP_GO_OVER,d7
beq.s .stop_recursif
move ob_head(a2),d1 ; ai-je un fils ?
bpl.s .child_exist
.continue_brother_father:
move ob_next(a2),d1 ; ai-je une famille autre que mon père
move.w d1,d0
cmp.w (a7),d1
beq.s .back_2_father
mulu #L_OBJECT,d1
lea (a0,d1.l),a2
bra.s .same_level
.child_exist:
move.w d1,d2 ; d2.w : fils
mulu #L_OBJECT,d1
lea (a0,d1.l),a2
move.w d0,d1 ; d1.w : l'ancien père c'est moi
move.w d2,d0 ; d0.w ; courant = fils
bsr GWVA_RSC_GO_OVER_TREE
move.l 2(a7),a2 ; mon adresse
cmp.w #GWVA_RSC_CTE_STOP_GO_OVER,d7
bne.s .continue_brother_father
bra.s .stop_recursif
.back_2_father:
move.w #GWVA_RSC_CTE_CONTINUE_GO_OVER,d7
.stop_recursif:
unlk a6
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_ENABLE_DISABLE_OBJECT
; Description : active/déactive un objet GEM
;
; in : d0.w = index du formulaire
; in : d1.w = index de l'objet
; in : d2.w = nouvel état désiré (0 : enable, 1 : disable)
;
; 19/03/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_ENABLE_DISABLE_OBJECT: ; d0.w : numéro du formulaire, d1.w : numéro de l'objet, d2=nouvel état (1=disable)
save.w d2
bsr GWVA_RSC_RETURN_PTR_ON_OBJ
load.w d2
bclr #DISABLED,ob_state+1(a1)
tst d2
beq.s .cleared
bset #DISABLED,ob_state+1(a1)
.cleared: rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_RETURN_OBJ_POS_SIZE
; Description : Renvoie la position et la taille "vraies" d'un objet GEM,
; Description : sculptures comprises
;
; Rq : Problèmes si les sculptures d'un fils dépassent de son père
;
; in : a0.l = pointeur sur l'arbre
; in : d0.w = index de l'objet
; out : a0.l = pointeur sur l'objet
; out : d0-d3.w = x,y,w,h réelle de l'objet
;
; 19/03/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_RETURN_OBJ_POS_SIZE:
move.w d0,d7 ; pour plus tard ...
move.l a0,a1 ; pour plus tard ...
mulu #L_OBJECT,d0
lea (a0,d0.l),a0 ; ptr sur l'objet GEM
clr.w d0
move.b ob_type+1(a0),d0 ; type de l'objet
clr.w d1 ; épaisseur bord gauche
clr.w d2 ; épaisseur bord droit
clr.w d3 ; épaisseur bord haut
clr.w d4 ; épaisseur bord bas
cmp.w #G_BOX,d0
beq .taille_bord_dans_ob_spec
cmp.w #G_IBOX,d0
beq .taille_bord_dans_ob_spec
cmp.w #G_BOXCHAR,d0
beq .taille_bord_dans_ob_spec
cmp.w #G_BOXTEXT,d0
beq .taille_bord_dans_structure_ob_spec
cmp.w #G_FBOXTEXT,d0
beq .taille_bord_dans_structure_ob_spec
.tests_ob_state:
move.w ob_state(a0),d0
btst #OUTLINED,d0
beq.s .pas_outlined
cmp.w #GWVA_RSC_CTE_EPAISSEUR_OUTLINED,d1
bge.s .taille_prise_en_compte
move.w #GWVA_RSC_CTE_EPAISSEUR_OUTLINED,d1
move.w #GWVA_RSC_CTE_EPAISSEUR_OUTLINED,d2
move.w #GWVA_RSC_CTE_EPAISSEUR_OUTLINED,d3
move.w #GWVA_RSC_CTE_EPAISSEUR_OUTLINED,d4
.taille_prise_en_compte:
.pas_outlined:
btst #SHADOWED,d0
beq.s .pas_shadowed
cmp.w #GWVA_RSC_CTE_EPAISSEUR_SHADOWED,d2
bge.s .taille_prise_en_compte2a
move.w #GWVA_RSC_CTE_EPAISSEUR_SHADOWED,d2
.taille_prise_en_compte2a:
cmp.w #GWVA_RSC_CTE_EPAISSEUR_SHADOWED,d4
bge.s .taille_prise_en_compte2b
move.w #GWVA_RSC_CTE_EPAISSEUR_SHADOWED,d4
.taille_prise_en_compte2b:
.pas_shadowed:
move.w GWVA_ROOT_SYSTEM_AES_3D_VBORDER,d5
move.w GWVA_ROOT_SYSTEM_AES_3D_HBORDER,d6
move.w ob_flags(a0),d0
and.w #MASK_FL3DIND|MASK_FL3DBAK,d0 ; on garde que les bits 3D
cmp.w #MASK_FL3DIND,d0
beq.s .bit_indicateur3D
cmp.w #MASK_FL3DACT,d0
bne.s .pas_activateur3D
.bit_indicateur3D:
cmp.w d5,d1
bge.s .taille_prise_en_compte3a
move.w d5,d1
.taille_prise_en_compte3a:
cmp.w d5,d2
bge.s .taille_prise_en_compte3b
move.w d5,d2
.taille_prise_en_compte3b:
cmp.w d6,d3
bge.s .taille_prise_en_compte4a
move.w d6,d3
.taille_prise_en_compte4a:
cmp.w d6,d4
bge.s .taille_prise_en_compte4b
move.w d6,d4
.taille_prise_en_compte4b:
.pas_activateur3D:
tst.w d1
bge.s .bord_gauche_positif
clr.w d1
.bord_gauche_positif:
tst.w d2
bge.s .bord_droit_positif
clr.w d2
.bord_droit_positif:
tst.w d3
bge.s .bord_haut_positif
clr.w d3
.bord_haut_positif:
tst.w d4
bge.s .bord_bas_positif
clr.w d4
.bord_bas_positif:
clr.w d0
move.b ob_type+1(a0),d0
cmp.w #G_BUTTON,d0
bne.s .pas_tests_bouton
cmp.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d1 ; taille de 1 en plus de base pour les boutons
bge.s .taille_prise_en_compte7a
move.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d1
.taille_prise_en_compte7a:
cmp.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d2
bge.s .taille_prise_en_compte7b
move.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d2
.taille_prise_en_compte7b:
cmp.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d3
bge.s .taille_prise_en_compte8a
move.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d3
.taille_prise_en_compte8a:
cmp.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d4
bge.s .taille_prise_en_compte8b
move.w #GWVA_RSC_CTE_EPAISSEUR_G_BUTTON,d4
.taille_prise_en_compte8b:
move.w ob_flags(a0),d0
btst #MASK_DEFAULT,d0
beq.s .pas_defaut
addq.w #1,d1 ; se rajoute à tout
addq.w #1,d2
addq.w #1,d3
addq.w #1,d4
.pas_defaut:
btst #MASK_EXIT,d0
beq.s .pas_exit
addq.w #1,d1 ; se rajoute à tout
addq.w #1,d2
addq.w #1,d3
addq.w #1,d4
.pas_exit:
.pas_tests_bouton:
save.l d0-d4/a0
objc_offset a1,d7
load.l d0-d4/a0
movem.w int_out+1*2,d5-d6
sub.w d1,d5
sub.w d3,d6
add.w d1,d2
add.w d4,d3
add.w ob_width(a0),d2
add.w ob_height(a0),d3
move.w d5,d0
move.w d6,d1
rts
.taille_bord_dans_ob_spec:
move.b ob_spec+1(a0),d1 ; epaisseur signée de la bordure
ext.w d1
neg.w d1
move.w d1,d2
move.w d1,d3
move.w d1,d4
bra .tests_ob_state
.taille_bord_dans_structure_ob_spec:
move.w ([a0,ob_spec],te_thickness),d1 ; epaisseur signée de la bordure
neg.w d1
move.w d1,d2
move.w d1,d3
move.w d1,d4
bra .tests_ob_state
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_RETURN_PTR_ON_TEXT
; Description : Renvoie les tailles courantes et max. d'un objet RSC contenant du texte.
;
; in : d0.w = numéro formulaire
; in : d1.w = numéro de l'objet avec ted info : G_TEXT ou G_BOXTEXT ou G_FTEXT
; ou G_FBOXTEXT ou sans : G_STRING ... etc ...
; out : a0.l = pointeur sur l'objet RSC
; out : a1.l = pointeur sur le texte
;
; 01/02/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_RETURN_PTR_ON_TEXT:
bsr GWVA_RSC_RETURN_PTR_ON_OBJ
move.l a1,a0
move ob_type(a1),d0
and.w #$ff,d0
cmp.w #G_TEXT,d0
beq.s .theres_ted_info
cmp.w #G_BOXTEXT,d0
beq.s .theres_ted_info
cmp.w #G_FTEXT,d0
beq.s .theres_ted_info
cmp.w #G_FBOXTEXT,d0
beq.s .theres_ted_info
move.l ob_spec(a1),a1 ; a1.l = pointeur du texte voulu
rts
.theres_ted_info:
move.l ob_spec(a1),a1
move.l te_ptext(a1),a1 ; a1.l = pointeur du texte voulu
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_COUNT_TEXT_OBJ_LENGTH
; Description : Renvoie les tailles courantes et max. d'un objet RSC contenant du texte.
;
; in : d0.w = numéro formulaire
; in : d1.w = numéro de l'objet avec ted info : G_TEXT ou G_BOXTEXT ou G_FTEXT
; ou G_FBOXTEXT ou sans : G_STRING ... etc ...
; out : a0.l = pointeur sur le texte
; out : a1.l = pointeur sur l'objet ressource
; out : d0.l = taille courante du texte dans le champs (éventuellement éditable)
; out : d1.w = taille maximale du texte possible (n'a de sens que pour les textes éditables)
;
; 01/02/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_COUNT_TEXT_OBJ_LENGTH:
bsr.s GWVA_RSC_RETURN_PTR_ON_TEXT
exg.l a1,a0
bsr GWVA_COUNT_BYTES_0
move d0,d1 ; par défaut, la longueur max est la longueur
; courante
move ob_type(a1),d2
and.w #$ff,d2
cmp.w #G_TEXT,d2
beq.s .theres_ted_info
cmp.w #G_BOXTEXT,d2
beq.s .theres_ted_info
cmp.w #G_FTEXT,d2
beq.s .theres_ted_info
cmp.w #G_FBOXTEXT,d2
beq.s .theres_ted_info
rts
.theres_ted_info:
move.w ([a1,ob_spec],te_txtlen),d1 ; longueur du texte max
subq #1,d1 ; moins le 0
rts
ifd LIB_MODAL_FORMULARY
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_MODAL_FORM
; Description : Fonction pour l'affichage d'un formulaire modal
;
; in : d0.w = numéro formulaire
; out : d0.w = objet EXIT ou TOUCHEXIT
;
; 31/01/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_MODAL_FORM:
lea GWVA_RSC_TMP_ADD_TREE,a0
bsr GWVA_RSC_RETURN_PTR_ON_TREE
ifd MDL_COLORS
lea GWVA_ROOT_TMP_PALETTE,a0
bsr GWVA_ROOT_STORE_VDI_PALETTE
bsr GWVA_ROOT_SET_DESK_PALETTE
endc ; ifd MDL_COLORS
wind_update #BEG_UPDATE
wind_update #BEG_MCTRL
form_center GWVA_RSC_TMP_ADD_TREE
movem.w int_out+1*2,d1-d4
save.w d1-d4
graf_mouse #M_OFF
movem.w (sp),d1-d4
form_dial #FMD_START,#0,#0,#0,#0,d1,d2,d3,d4
movem.w (sp),d1-d4
form_dial #FMD_GROW,#0,#0,#10,#10,d1,d2,d3,d4
movem.w (sp),d1-d4
objc_draw GWVA_RSC_TMP_ADD_TREE,#0,#12,d1,d2,d3,d4
graf_mouse #M_ON
form_do GWVA_RSC_TMP_ADD_TREE,#0
load.w d1-d4
save.w d0-d4
move.l GWVA_RSC_TMP_ADD_TREE,a0
move d0,d1
mulu #L_OBJECT,d1
bclr #SELECTED,ob_state+1(a0,d1.l) ; de-selected
graf_mouse #M_OFF
movem.w (sp),d0-d4
form_dial #FMD_SHRINK,#0,#0,#10,#10,d1,d2,d3,d4
movem.w (sp),d0-d4
form_dial #FMD_FINISH,#0,#0,#0,#0,d1,d2,d3,d4
graf_mouse #M_ON
wind_update #END_MCTRL
wind_update #END_UPDATE
ifd MDL_COLORS
lea GWVA_ROOT_TMP_PALETTE,a0
bsr GWVA_ROOT_SET_VDI_PALETTE
endc ; ifd MDL_COLORS
load.w d0-d4
rts
endc ; ifd LIB_MODAL_FORMULARY
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_ALERT_BOX
; Description : Fonction pour l'affichage d'une boite d'alerte à partir d'un ressource
;
; in : d0.w = numéro de l'alert box dans le ressource
; in : d1.w = numero du bouton par défaut gauche(1)->milieu(2)->droite(3)
; out : d0.w = numéro du bouton pressé
;
; 31/01/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_ALERT_BOX:
save.w d1
rsrc_gaddr #5,d0 ; R_STRING : Free String Data
move.l addr_out,a0
load.w d0
bsr GWVA_ROOT_PRG_ALERT_BOX
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_RETURN_PTR_ON_TREE
; Description : Renvoie un pointeur sur un arbre RSC
;
; in : a0.l = adresse de stockage de l'adresse de base du formulaire
; in : d0.w = numéro du formulaire
; out : (a0) = pointeur sur l'arbre
; out : d0.w = 0 si erreur, <> 0 sinon.
;
; 11/01/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_RETURN_PTR_ON_TREE:
save.l a0
rsrc_gaddr #0,d0 ; En retour, d0<>0 = Ok
load.l a0
move.l addr_out,(a0)
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_RETURN_PTR_ON_OBJ
; Description : Renvoie un pointeur sur un objet RSC dans un formulaire
;
; in : d0.w = numéro du formulaire
; in : d1.w = numéro de l'objet
; out : a1.l = pointeur sur l'objet GEM
;
; 11/01/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_RETURN_PTR_ON_OBJ:
save.w d1
lea GWVA_RSC_TMP_ADD_TREE,a0
bsr.s GWVA_RSC_RETURN_PTR_ON_TREE
move.l (a0),a1
load.w d0
mulu #L_OBJECT,d0
add.l d0,a1
rts
*-----
ifd MDL_MENU
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_FIND_SON_OBJECT_FROM_ORDINAL
; Description : retourne un pointeur sur le fils No X d'un père
;
; in : a0.l = pointeur sur un tree
; in : d0.w = ordinal du fils (0,...) recherché
; in : d1.w = index du père
; out : a0.l = pointeur sur le fils recherché
; out : d0.w = index du fils recherché
; out : d7.w = GWVA_ERROR_GENERIC si pas dans la liste des fils
;
; 17/01/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_FIND_SON_OBJECT_FROM_ORDINAL:
move d1,d2
mulu #L_OBJECT,d2
lea 0(a0,d2.l),a1
move.w ob_head(a1),d3
bmi.s .pas_trouve_fils
sub.w #1,d0
bmi.s .trouve_fils
.boucle: mulu #L_OBJECT,d3
lea 0(a0,d3.l),a1
move ob_next(a1),d3
cmp.w d1,d3
beq.s .pas_trouve_fils
sub.w #1,d0
bpl.s .boucle
.trouve_fils:
move.w d3,d0
mulu #L_OBJECT,d3
lea 0(a0,d3.l),a0
moveq #GWVA_NO_ERROR_GENERIC,d7
rts
.pas_trouve_fils:
moveq #GWVA_ERROR_GENERIC,d7
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_FIND_ORDINAL_SON_OBJECT
; Description : renvoie le No ordinal d'un fils par rapport à son père
;
; in : a0.l = pointeur objet root d'un form
; in : d0.w = numéro du fils
; in : d1.w = numéro du père
; out : a0.l = pointeur sur le fils
; out : d0.w = ordinal du fils (0,...)
; out : d7.w = GWVA_NO_ERROR_GENERIC si OK
; ou GWVA_ERROR_GENERIC si pas dans la liste des fils
;
; 14/02/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_FIND_ORDINAL_SON_OBJECT:
move d1,d2
mulu #L_OBJECT,d2
lea 0(a0,d2.l),a1
moveq #0,d4 ; 1er fils
move.w ob_head(a1),d3
bmi.s .pas_de_fils
cmp.w d0,d3
beq.s .trouve_fils
.boucle: mulu #L_OBJECT,d3
lea 0(a0,d3.l),a1
add.w #1,d4
move ob_next(a1),d3
cmp.w d1,d3 ; on est revenu au père : erreur
beq.s .pas_trouve_fils
cmp.w d0,d3
bne.s .boucle
.trouve_fils:
mulu #L_OBJECT,d3
lea 0(a0,d3.l),a0
move.w d4,d0
moveq #GWVA_NO_ERROR_GENERIC,d7
rts
.pas_de_fils:
.pas_trouve_fils:
moveq #GWVA_ERROR_GENERIC,d7
rts
endc ; ifd MDL_MENU
ifd MDL_GEM ; en ont besoin : le menu et l'objet popup
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_FIND_FATHER_OBJECT
; Description : renvoie l'index du père d'un objet
;
; in : a0.l : pointeur objet root d'un form
; in : d0.w : numéro du fils dont on cherche le père
; out : a0.l : pointeur sur cet objet (le père)
; out : d0.w : index du père
; out : d7.w = GWVA_NO_ERROR_GENERIC si OK
; ou GWVA_ERROR_GENERIC si pas de père
;
; 14/02/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_FIND_FATHER_OBJECT:
tst d0
beq.s .root
move d0,d1
mulu #L_OBJECT,d1
lea 0(a0,d1.l),a1
move d0,d1 ; d0=courant d1=précédent
.boucle: move ob_next(a1),d0
move d0,d2
mulu #L_OBJECT,d2
lea 0(a0,d2.l),a1 ; a1 : adresse de l'objet courant
cmp ob_tail(a1),d1 ; est-ce que ob_tail obj suivant = nous ?
beq.s .found_father
move d0,d1 ; nouveau précédent = courant pour la suite
bra.s .boucle
.found_father:
move.l a1,a0
moveq #GWVA_NO_ERROR_GENERIC,d7
rts
.root: moveq #GWVA_ERROR_GENERIC,d7
rts
endc ; ifd MDL_GEM
ifd MDL_WIND_MENU
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_SHOW_HIDE_TREE
; Description : montre ou cache un arbre
;
; in : d0.w : index du tree
; in : d1.w : index de l'objet RSC
; in : d2.w : nouvel état 0 = show, 1 = hide
; out : a0.l : pointeur sur le fils recherché
; out : d0.w : index du fils à cacher/montrer
; out : d7.w : GWVA_ERROR_GENERIC si pas dans la liste des fils
;
; 17/01/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_SHOW_HIDE_TREE:
save.w d2
bsr GWVA_RSC_RETURN_PTR_ON_OBJ
load.w d2
bclr #HIDETREE,ob_flags+1(a1)
tst d2
beq.s .cleared
bset #HIDETREE,ob_flags+1(a1)
.cleared: rts
endc ; ifd MDL_WIND_MENU
ifd MDL_RELOCATE_RSC
ifnd LIB_SEARCH_SYSTEM_COOKIES
ifnd LIB_SEARCH_COOKIES
ifd OPT_GWVA_DEBUG_PRINT_COMMENTS
LIST
;------------------------------------------------------------------------------
; Rq : Lorsque vous utilisez MDL_RELOCATE_RSC, définir LIB_SEARCH_SYSTEM_COOKIES
; Rq : ou au moins LIB_COOKIE pour permettre d'utiliser les nouvelles
; Rq : fonctionnalités de l'AES 4.
;------------------------------------------------------------------------------
NOLIST
endc
endc
endc
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_RELOCATE_RSC
; Description : Fonction faisant la relocation d'un ressource en mémoire
; Description : et permettant au système de l'utiliser normalement
;
; in : a0.l = pointeur sur le ressource en mémoire
; out : d7.w = GWVA_NO_ERROR_GENERIC ou GWVA_ERROR_GENERIC
;
; 11/01/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_RELOCATE_RSC:
cmp.l #0,a0
ble .erreur_ressource
ifnd LIB_SEARCH_SYSTEM_COOKIES
ifd LIB_COOKIE
move.l #"MagX",GWVA_ROOT_SEARCH_IN_OUT
save.l a0
SUPEXEC GWVA_COOKIE_SEARCH_ONE_COOKIE
load.l a0
tst.l GWVA_ROOT_SEARCH_IN_OUT
beq.s .magic_not_present
endc ; ifd LIB_COOKIE
else
tst.l GWVA_ROOT_COOKIE_MAGIC ; l'AES de MagiC est le 3.99 mais il supporte rsrc_rcfix ...
bne.s .magic_present
endc ; ifnd LIB_SEARCH_SYSTEM_COOKIES
.magic_not_present:
cmp.w #$400,global+_AESversion
blt.s .pas_AES400
.magic_present:
rsrc_rcfix a0 ; supporte tous les formats, plus rapide ...
tst d0
beq .erreur_ressource
moveq #GWVA_NO_ERROR_GENERIC,d7
rts
.erreur_ressource:
moveq #GWVA_ERROR_GENERIC,d7
rts
.pas_AES400:
; a0.l
lea GWVA_ROOT_ADD_MALLOC_RSC_ICN,a1
bsr GWVA_RSC_RELOCATE_RSC_IN_MEM
cmp.w #GWVA_NO_ERROR_GENERIC,d7
bne.s .erreur_ressource
move.l a0,a1
add.w #L_RSC_HEADER,a1
move.l a1,global+_AESrscfile ; on stocke l'adresse du début du ressource (documenté)
move.l a0,global+_AESrscfile+4 ; on stocke l'adresse du début du fichier RSC (non documenté)
move.w rsh_rssize(a0),global+_AESrscfile+4+4 ; on stocke la taille du ressource (non documenté)
move.w rsh_vrsn(a0),global+_AESrscfile+4+4+2 ; on stocke la version du ressource (non documenté)
btst #2,rsh_vrsn+1(a0)
beq.s .old_rsc2
; Là je sais pas si on doit stocker un mauvaise taille dans le cas d'un
; formulaire pour l'AES 3.3 ???
move.l a0,a1
add.w rsh_rssize(a0),a1
move.w 2(a1),global+_AESrscfile+4+4
.old_rsc2:
moveq #GWVA_NO_ERROR_GENERIC,d7
rts
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_RSC_RELOCATE_RSC_IN_MEM
; Description : Fonction faisant uniquement la relocation d'un ressource en mémoire
;
; in : a0.l = pointeur sur le ressource en mémoire
; in : a1.l = pointeur sur 2 mots long (pour le traitement des icones couleurs)
; le premier contiendra l'adresse du MALLOC des icones couleurs, 0.l sinon.
; Au programmeur de libérer cet espace mémoire lorsqu'il n'a plus besoin
; du ressource
; out : d7.w = GWVA_NO_ERROR_GENERIC ou erreur
;
; 11/01/98 : Création
;------------------------------------------------------------------------------
GWVA_RSC_RELOCATE_RSC_IN_MEM:
move.l a0,d0
btst #0,d0
beq.s .rsc_sur_adresse_paire
ifd OPT_GWVA_DEBUG_ERROR
lea GWVA_ASCII_ERROR_RSC_ON_ODD_ADDRESS,a6
illegal
endc
bra .erreur_ressource
.rsc_sur_adresse_paire:
clr.l (a1)
clr.l 4(a1)
tst.w rsh_vrsn(a0)
beq .old_format
cmp.w #1,rsh_vrsn(a0)
beq .old_format
btst #2,rsh_vrsn+1(a0)
beq .erreur_ressource
; New format !
; Ne gere pas le format étendu : rsh_vrsn = $0003
bsr .traitement_icones_couleurs
.old_format:
; fin du traitement des icones couleur, ouf !
move.w #rsh_frstr,d1
move rsh_nstring(a0),d0
bsr .reloc_array
move.w #rsh_frimg,d1
move rsh_nimages(a0),d0
bsr .reloc_array
move.w #rsh_trindex,d1
move rsh_ntree(a0),d0
bsr .reloc_array
; reloc la table des teds_info
move.l a0,a1
move.l a0,d7
add.w rsh_tedinfo(a0),a1
move rsh_nted(a0),d0
subq #1,d0
bmi.s .nothing1
.reloc_ptrs_ted:
add.l d7,te_ptext(a1)
add.l d7,te_ptmplt(a1)
add.l d7,te_pvalid(a1)
lea L_TEDINFO(a1),a1
dbf d0,.reloc_ptrs_ted
.nothing1:
; reloc la table des icon_blk
move.l a0,a1
move.l a0,d7
add.w rsh_iconblk(a0),a1
move rsh_nib(a0),d0
subq #1,d0
bmi.s .nothing2
.reloc_ptrs_iconblk:
add.l d7,ib_pmask(a1)
add.l d7,ib_pdata(a1)
add.l d7,ib_ptext(a1)
lea L_ICONBLK(a1),a1
dbf d0,.reloc_ptrs_iconblk
.nothing2:
; reloc la table des bit_blk
move.l a0,a1
move.l a0,d7
add.w rsh_bitblk(a0),a1
move rsh_nbb(a0),d0
subq #1,d0
bmi.s .nothing3
.reloc_ptrs_bitblk:
add.l d7,bi_pdata(a1)
lea L_BITBLK(a1),a1
dbf d0,.reloc_ptrs_bitblk
.nothing3:
; reloc la table des cicon_blk
; parse tous les objets
move rsh_ntree(a0),d0
subq #1,d0
bmi .nothing4
move.l a0,a1
move.l a0,d7
add.w rsh_trindex(a0),a1
.parse_all_trees:
move.l (a1)+,a2
move #1-1,d1
tst ob_tail(a2)
bmi.s .pas_de_fils
move ob_tail(a2),d1 ; +1 pour le père -1 pour dbf
.pas_de_fils:
clr d2 ; No objet = pere
.parse_all_this_tree: ; -4(a1) =ptr tree a2=ptr object
move.w ob_type(a2),d3
and.w #$ff,d3
cmp.w #G_TEXT,d3
beq.s .reloc_ted
cmp.w #G_BOXTEXT,d3
beq.s .reloc_ted
cmp.w #G_FTEXT,d3
beq.s .reloc_ted
cmp.w #G_FBOXTEXT,d3
bne.s .no_reloc_ted
.reloc_ted: add.l d7,ob_spec(a2)
.no_reloc_ted:
cmp.w #G_IMAGE,d3
beq.s .reloc_classique
cmp.w #G_BUTTON,d3
beq.s .reloc_classique
cmp.w #G_STRING,d3
beq.s .reloc_classique
cmp.w #G_ICON,d3
beq.s .reloc_classique
cmp.w #G_TITLE,d3
beq.s .reloc_classique
cmp.w #G_CICON,d3
bne.s .reloc_done
move.l ob_spec(a2),d4
lsl.l #2,d4
move.l a0,a3
add.w rsh_rssize(a0),a3
lea ([4,a3],a0.l),a3 ; ptr table de ptrs sur les Cicons blk
move.l (a3,d4.l),ob_spec(a2)
bra.s .reloc_done
.reloc_classique:
add.l d7,ob_spec(a2)
.reloc_done:
.pas_reloc_struct:
save.l d0-d2/d7/a0-a2
rsrc_obfix -4(a1),d2 ; caractère -> pixel
load.l d0-d2/d7/a0-a2
move.w ob_head(a2),d3
bmi.s .pas_de_fils2
move.w d3,d2
mulu #L_OBJECT,d3
add.l -4(a1),d3
move.l d3,a2
bra.s .next_object
.pas_de_fils2:
.next_is_dad:
move.w d2,d3 ; objet courant
move.w ob_next(a2),d2
ble.s .pas_de_frere_pere ; -> le suivant est le root ou le root est tout seul
move.w d2,d4
mulu #L_OBJECT,d4
add.l -4(a1),d4
move.l d4,a2
cmp.w ob_tail(a2),d3
beq.s .next_is_dad
.next_object:
bra .parse_all_this_tree
.pas_de_frere_pere:
dbf d0,.parse_all_trees
.nothing4:
moveq #GWVA_NO_ERROR_GENERIC,d7
rts
.erreur_ressource:
moveq #GWVA_ERROR_GENERIC,d7
rts
*--------------------------*
.traitement_icones_couleurs:
move.l a0,a2
add.w rsh_rssize(a0),a2
move.l 4(a2),d0
lea (a0,d0.l),a2 ; ptr table de ptrs sur les Cicons blk
move.l a2,a3
moveq #-1,d0
.count: addq #1,d0
tst.l (a3)+
beq.s .count
; a2 pointe sur le premier CICONBLK
subq #1,d0 ; nbre d'icone couleur
tst d0
bmi .no_cicon
* cmp.w #2,GWVA_ROOT_VDI_WORKSTATION+39*2 ; nbre de couleur de la station
* beq .pas_besoin_icones_couleurs ; en monochrome, on prend la definition monochrome
clr.l d4 ; taille des icones couleurs à réserver
clr.l d7 ; taille max d'une icone
;
save.l d0/a1-a2
.parse_all_icons1:
save.w d0
move.l a3,(a2)+
move.l a3,a4
add.l #L_CICONBLK,a4
move ib_wicon(a3),d1
ext.l d1
divu #16/2,d1
mulu ib_hicon(a3),d1 ; d1=taille mono en byte
move.l a4,ib_pdata(a3)
add.l d1,a4
move.l a4,ib_pmask(a3)
add.l d1,a4
move.l a4,ib_ptext(a3)
add.w #12,a4 ; longeur d'un texte
move.l mainlist(a3),d2 ; nb_cicon >=1
subq.w #1,d2
move.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d5 ; nbre de plans affichés
.find_a_good_resolution_for_this_icone:
save.l d2/a4 ; d2 : nbr de résolution, a4 pointe la liste de résolution
bsr .parse_all_icone_resolutions
move.l a4,a5
load.l d2/a4
tst d0
beq.s .good_resolution_found
lsr.w #1,d5 ; 8 -> 4 -> 2 -> 1 plans ...
tst d5
bne .find_a_good_resolution_for_this_icone
lea 0.w,a5 ; pas d'icone couleur correspondant a la résolution souhaitée
.good_resolution_found:
move.l a5,mainlist(a3) ; on pointe directement sur l'icone correspondant le mieux à la résolution souhaitée
move.w #-1,d5 ; pour passer les définitions de cette icone
bsr .parse_all_icone_resolutions
move.l a5,a3 ; icone suivante
load.w d0
dbf d0,.parse_all_icons1
load.l d0/a1-a2
tst.l d4 ; reservation memoire ?
bne.s .malloc_icone
tst.l d7
bne.s .malloc_transfert
bra.s .pas_de_malloc
.malloc_icone:
save.l d0/d7/a0-a2
MXALLOC #MX_PREFTTRAM,d4
move.l d0,d1
load.l d0/d7/a0-a2
move.l d1,(a1)
.malloc_transfert:
save.l d0/a0-a2
add.l d7,d7 ; pour la selection eventuelle
MXALLOC #MX_PREFTTRAM,d7
move.l d0,d1
load.l d0/a0-a2
move.l d1,4(a1)
.pas_de_malloc:
*.pas_besoin_icones_couleurs:
move.l (a1),d4 ; adresse du malloc pour les icones couleurs
.parse_all_icons2:
move.l (a2)+,a3
* move.l a3,a4
* add.l #L_CICONBLK,a4 ; ?_ERROR_? (lignes -> move.l mainlist(a3),a4 ; on pointe directement sur la bonne icone
move ib_wicon(a3),d1
ext.l d1
divu #16/2,d1
mulu ib_hicon(a3),d1 ; d1=taille mono en byte
move.l mainlist(a3),a4 ; on pointe directement sur la bonne icone
cmp.l #0,a4
beq .pas_definition_couleur
move.w d1,d3 ; taille mono
mulu num_planes(a4),d3 ; d3.l taille icone couleur
move.l col_data(a4),a5
move.l 4(a1),d7
bsr .cree_resolution_icone
move d1,d5
mulu GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d5
add.l d5,d7
tst.l sel_data(a4)
beq.s .pas_icone_selectionnee2
move.l sel_data(a4),a5
bsr .cree_resolution_icone
.pas_icone_selectionnee2:
move.w num_planes(a4),d5
cmp.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d5
beq.s .transformation_en_place
move.l d4,col_data(a4) ; adresse de stockage finale
move d1,d6
mulu GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d6
add.l d6,d4
.transformation_en_place:
save.l d4-d5
move.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,num_planes(a4)
move.l 4(a1),d4 ; source icone
move.l col_data(a4),d5 ; destination
bsr .remets_plans_entrelaces_en_place
load.l d4-d5
tst.l sel_data(a4)
beq.s .pas_icone_selectionnee3
cmp.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d5
beq.s .transformation_en_place2
move.l d4,sel_data(a4)
move d1,d6
mulu GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d6
add.l d6,d4
.transformation_en_place2:
save.l d4
move.l 4(a1),d4
move d1,d5
mulu GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d5
add.l d5,d4 ; source
move.l sel_data(a4),d5 ; destination
bsr .remets_plans_entrelaces_en_place
load.l d4
.pas_icone_selectionnee3:
clr.l next_res(a4)
.pas_definition_couleur:
*.pas_icones_couleurs:
dbf d0,.parse_all_icons2
tst.l 4(a1)
beq.s .pas_buffer_temp
save.l a0-a1
MFREE 4(a1)
load.l a0-a1
clr.l 4(a1)
.pas_buffer_temp:
.no_cicon:
rts
*--------------------------------------*
.parse_all_icone_resolutions:
; d1.w : taille icone mono
; d4.l=0
; d5.w : résolution souhaitée
; d7.l=0
; a4.l : pointeur liste des résolutions
move.w d1,d3 ; taille mono
mulu num_planes(a4),d3 ; d3.l taille icone couleur
move.l a4,a5
add.l #L_CICON,a5
move.l a5,col_data(a4)
add.l d3,a5
move.l a5,col_mask(a4)
add.l d1,a5
; Est-ce une icone de la resolution recherchée ?
cmp.w num_planes(a4),d5
bne.s .saute_icone_couleur1
save.l d0
move d1,d0
mulu GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d0 ; d0.l taille icone couleur à la résolution de la station
; Est-ce une icone directement affichable ?
move.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d6
cmp.w num_planes(a4),d6
beq.s .pas_de_reservation1 ; transformation en place si icone de meme résolution
; Il faut reserver la place de l'icone
add.l d0,d4
.pas_de_reservation1:
cmp.l d0,d7
bge.s .max_taille_icone
move.l d0,d7
.max_taille_icone:
load.l d0
.saute_icone_couleur1:
tst.l sel_data(a4)
beq.s .pas_icone_selectionee
move.l a5,sel_data(a4)
add.l d3,a5
move.l a5,sel_mask(a4)
add.l d1,a5
cmp.w num_planes(a4),d5
bne.s .saute_icone_couleur2
move.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d6
cmp.w num_planes(a4),d6
beq.s .pas_de_reservation2 ; transformation en place si icone de meme résolution
move d1,d6
mulu GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d6
add.l d6,d4
.pas_de_reservation2:
.saute_icone_couleur2:
.pas_icone_selectionee:
cmp.w num_planes(a4),d5
beq.s .end_good_resolution_found
move.l a5,a4 ; résolution suivante
dbf d2,.parse_all_icone_resolutions
move.w #-1,d0 ; pas de résolution
rts
.end_good_resolution_found:
clr.w d0
rts
*--------------------------------------*
.cree_resolution_icone:
move.l d7,a6
move.l d3,d6
lsr.l #1,d6
.recopie_icone:
move.w (a5)+,(a6)+
subq.l #1,d6
bne.s .recopie_icone
save.w d0
move.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d0
sub.w num_planes(a4),d0
beq.s .pas_de_plan_en_plus
move.l d7,a5 ; zone de recopie
move.w d1,d6 ; taille d'un plan
sub.w #1,d6
.cree_plans_icone:
move.l a5,a6
move.w (a5)+,d5
move.w num_planes(a4),d0
subq.w #1,d0
.and_plans: and.w (a6),d5
lea (a6,d1.w),a6
dbf d0,.and_plans
move.w GWVA_ROOT_VDI_WORKSTATION_EXTD+4*2,d0
sub.w num_planes(a4),d0 ; on doit ajoutter des plans vides
subq.w #1,d0
.move_plans:move d5,(a6)
lea (a6,d1.w),a6
dbf d0,.move_plans
dbf d6,.cree_plans_icone
.pas_de_plan_en_plus:
load.w d0
rts
*--------------------------------------*
.remets_plans_entrelaces_en_place:
lea GWVA_ROOT_MFDB_SRC,a5
move.l d4,(a5)+ ; pointeur image
move.l ib_wicon(a3),(a5)+ ; largeur/hauteur image pixel
move.w ib_wicon(a3),d6
add.w #15,d6
ext.l d6
divu #16,d6
move.w d6,(a5)+ ; largeur image en mots
move.w #1,(a5)+ ; device independent
move.w num_planes(a4),(a5)+
clr.w (a5)+ ; reservés
clr.w (a5)+
clr.w (a5)+
lea GWVA_ROOT_MFDB_DEST,a5
move.l d5,(a5)+ ; pointeur image
move.l ib_wicon(a3),(a5)+ ; largeur/hauteur image pixel
move.w ib_wicon(a3),d6
add.w #15,d6
ext.l d6
divu #16,d6
move.w d6,(a5)+ ; largeur image en mots
move.w #0,(a5)+ ; device dependent
move.w num_planes(a4),(a5)+
clr.w (a5)+ ; reservés
clr.w (a5)+
clr.w (a5)+
save.l d0-d3/a0-a4
vr_trnfm #GWVA_ROOT_MFDB_SRC,#GWVA_ROOT_MFDB_DEST
load.l d0-d3/a0-a4
rts
*--------------------------------------*
.reloc_array:
move.l a0,a1
move.l a0,d7
add.w (a0,d1.w),a1
subq #1,d0
bmi.s .nothing
.reloc_array2:
add.l d7,(a1)+
dbf d0,.reloc_array2
.nothing: rts
endc ; ifd MDL_RELOCATE_RSC
;------------------------------------------------------------------------------
BSS
GWVA_RSC_TMP_ADD_TREE: ds.l 1
TEXT